package com.shujia.spark.mllib

import org.apache.spark.ml.feature.LabeledPoint
import org.apache.spark.ml.linalg
import org.apache.spark.ml.linalg.Vectors

object Demo1DataType {
  def main(args: Array[String]): Unit = {

    /**
      * 向量：有方向，有大小，可以理解为一个数值型的数组
      * 向量在spark中用来表示多个x ,
      * 机器学生的算子需要的数据必须是一个向量
      *
      */

    //稠密向量
    val dense: linalg.Vector = Vectors.dense(1.0, 0.0, 0.0, 2.0, 0.0, 0.0, 3.0, 4.0)
    println(dense)
    //稀疏向量
    val sparse: linalg.Vector = Vectors.sparse(8, Array(0, 3, 6, 7), Array(1.0, 2.0, 3.0, 4.0))
    println(sparse)

    /**
      * 稠密向量
      * [1.0,0.0,0.0,2.0,0.0,0.0,3.0,4.0]
      * 稀疏向量
      * (8,[0,3,6,7],[1.0,2.0,3.0,4.0])
      *
      * 如果一个向量中有很多位置为0.0，使用稀疏向量可以节省存储空间
      */

    //稠密向量和稀疏向量所包含的数据一样的，可以相互转换
    println(sparse.toDense)
    println(dense.toSparse)


    /**
      * 标记点：有目标值（y）和特征向量(x)组成
      *
      */

    val pos = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
    println(pos)

    val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
    println(neg)
  }

}
